package Ep02_LinkedList.LC_0002;

import Ep02_LinkedList.ListNode;

/**
 * @author Jimmy Zhan WORKSTATION
 * @since 2023/7/11 15:16
 * 说明：力扣 0002 两数之和
 *      双指针解法
 *      模拟相加，带一个进位符flag
 *      相加的时候判断进位符是否有效，如果有效就加1，然后flag置0
 *      然后判断当前值是否超过了10，如果是，就把flag置1
 *      顺序不能反，这样可以应对连续进位的情况
 */

public class Mine {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int flag = 0;
        ListNode resP = new ListNode();
        ListNode dummyHead = new ListNode();
        dummyHead.next = resP;


        // 双指针
        ListNode p1 = l1;
        ListNode p2 = l2;

        // 等长部分相加
        while(p1 != null && p2 != null) {
            resP.val = p1.val + p2.val;
            if(flag == 1) {
                resP.val += 1;
                flag = 0;
            }
            if (resP.val >= 10) {    // 进位
                flag = 1;
                resP.val -= 10;
            }
            // 指针后移
            p1 = p1.next;
            p2 = p2.next;
            if (p1 == null && p2 == null) break;
            resP.next = new ListNode();
            resP = resP.next;
        }

        // 不等长，考虑一次进位，然后直接加
        if(p1 == null && p2 != null) {
            while(p2 != null) {
                resP.val = p2.val;
                if(flag == 1) {
                    resP.val += 1;
                    flag = 0;
                }
                if (resP.val >= 10) {    // 进位
                    flag = 1;
                    resP.val -= 10;
                }
                p2 = p2.next;
                if (p2 == null) break;
                resP.next = new ListNode();
                resP = resP.next;
            }

        }
        if(p1 != null && p2 == null) {
            while(p1 != null) {
                resP.val = p1.val;
                if(flag == 1) {
                    resP.val += 1;
                    flag = 0;
                }
                if (resP.val >= 10) {    // 进位
                    flag = 1;
                    resP.val -= 10;
                }
                p1 = p1.next;
                if (p1 == null) break;
                resP.next = new ListNode();
                resP = resP.next;
            }
        }
        // 最后清算
        if (flag == 1) {
            resP.next = new ListNode();
            resP = resP.next;
            resP.val = 1;
        }

        return dummyHead.next;
    }
}
